home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Pascal Super Library
/
Pascal Super Library (CW International)(1997).bin
/
MATH
/
VLN_20
/
VLN23.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1995-03-30
|
5KB
|
156 lines
unit vln23; { a class of Very Large Number }
{))))))))))))))))))))))))))))))))))))))}
{} interface {}
{))))))))))))))))))))))))))))))))))))))}
uses winprocs;
const
vlSize = 1000; {a limit of about 2^16000 }
{ the working limit is wksize set in Unit Initialization }
vlmemsize = vlsize*4+4;
type
pWordArray = ^tWordArray;
tWordArray = array[1..vlSize] of word;
type
WArray = array[0..16] of word;
pWArray = ^WArray;
type pchar4 = array[0..4]of char;
type
pVryLrgNo = ^tVryLrgNo;
tVryLrgNo = object
count : integer;
max : integer;
sign : integer;
tVLN : tWordArray;
constructor Init( cnt, maxC, sgn : integer; pnew :pWordArray);
procedure SetVal( cnt, sgn : integer; pnew :pWordArray);
procedure __SetWord( n : integer; nval : word );
function __GetWord( n : integer) : word ;
procedure SetSmall(n:integer); { set immediate to 16 bits, signed }
procedure Clear( n : integer);
procedure AddBy(other : pVryLrgNo);
procedure AddN(n:integer);
procedure SubBy(other : pVryLrgNo);
procedure SubN(n:integer);
procedure TwosComplAbs( cnt : integer );
procedure Copy( other : pVryLrgNo ); { copy other into self }
procedure Recount;
procedure MulBy(other : pVryLrgNo);
procedure MulN(n:integer);
procedure DivN(n:integer);
function FindnoBinDig : integer; { how many binary digits }
procedure BigSHL(cnt : integer); {shift left by words }
procedure MultiSHL(sf_cnt : integer); {shift left by words }
procedure Shr1Bit; {shift right one bit}
procedure ShL1Bit; {shift left one bit}
function FindDivShift(other : pVryLrgNo) : integer;
{shift in prep for dividing}
procedure DivBy( dvsr, remnd : pVryLrgNo);
procedure SetRandom(binCnt : integer);
procedure TwoNth(n:integer );
procedure TenNth(n:integer );
procedure NthRoot(n:integer );
procedure NthPower(n:integer );
procedure FastNthPower(n:integer );
end;
function MaxOfW(a,b : word) : word;
function IsGrEqAbs(n1, n2 : pVryLrgNo): boolean; { true if n1>= n2 }
function IsEqAbs(n1, n2 : pVryLrgNo): boolean;
{ true if n1= n2 }
procedure HexWord( w : word; var pS : pchar4);
procedure SetWkSize(n:integer); export;
function GetWkSize : integer; export;
procedure CloseTempRegs; export;
procedure OpenTempRegs; export;
procedure CallError(s:String);
function GetCount( regNo : integer ) : integer; export;
function GetSign( regNo : integer ) : integer; export;
function FlipSign( regNo : integer ) : integer; export;
procedure Register_OP ( Reg1, op, Reg2 : integer); export;
procedure Number_OP( Reg1, op, aNum : integer); export;
procedure Op_2Self( Reg1, op : integer); export;
function SetWord( Reg1, pos : integer; nval : word )
: integer; export;
function GetWord( Reg1, n : integer) : word ; export;
function Compare( Reg1, op, Reg2 : integer ): boolean; export;
function GetBinSize ( Reg1 : integer ) : integer; export;
function FastDiv ( dvnd , dvsr : integer ) : integer; export;
function DivByBillion( regNo : integer ) : longint; export;
{ new quotient is in Register 75 }
var
dec_10e9 , { divisor for Decimal printout}
decPointShift {offset for fraction printout }
: pVryLrgNo;
HighVar : integer;
vlnVars : array[0..99] of pVryLrgNo;
wksize : integer;
{))))))))))))))))))))))))))))))))))))))}
{} implementation {}
{))))))))))))))))))))))))))))))))))))))}
{$I getset.inc}
{$I arithm2.inc}
{$I utils1.inc}
{((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((}
{ Unit initialization }
{((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((}
begin
HighVar := 0;
for HighVar := 75 downto 0 do
vlnVars[HighVar] := nil;
getmem(dec_10e9, 10); { 2 * (words + sign + count + max) }
getmem(decPointShift, 22);
with dec_10e9^ do
begin
count := 2;
max := 2;
sign := 1;
tvln[1] := $CA00; { = 1 * 10^9 }
tvln[2] := $3B9A;
end;
with decPointShift^ do
begin
count := 8;
max := 8;
sign := 1;
tVLN[1] := $0;
tVLN[2] := $0;
tVLN[3] := $9f10; { 10 ^ 36 gives 36 decimal precision}
tVLN[4] := $b34b;
tVLN[5] := $715;
tVLN[6] := $7bc9;
tVLN[7] := $97ce;
tVLN[8] := $c0;
end;
wksize := 500;
end.